import { isString, isNumber, isObject, isEmpty } from "./check"

/**
 * @description: 添加变量
 * @param {string} name 变量名称
 * @return {*}
 */
export function useVar(varName) {
  return `var(--${varName})`
}

/**
 * @description: 添加颜色
 * @param {string} color 颜色名称
 * @return {*}
 */
export function useColor(color) {
  const vars = ["page", "theme"]
  if (vars.includes(color)) {
    return useVar(`${color}-color`)
  } else {
    return color
  }
}

/**
 * 将值转换为带有单位的字符串
 * @param {string|number} value - 要转换的值
 * @param {string} [unit='rpx'] - 单位，默认为'rpx'
 * @returns {string} - 转换后的带有单位的字符串
 */
export function useUnit(value = 0, unit = "rpx") {
  if (/\s+/.test(value)) {
    let values = value.trim().split(/\s+/)
    value = values.map((item) => (isNumber(String(item)) ? `${item}${unit}` : item)).join(" ")
  }
  return isNumber(value) ? `${value}${unit}` : value
}

/**
 * @description: 单位值转PX单位值
 * @param {string} value 单位值
 * @return {string}
 */
export function unitToPx(value = 0) {
  value = useUnit(value)
  if (~value.indexOf("rpx")) {
    return isNumber(value.split("rpx")[0]) ? uni.upx2px(value.split("rpx")[0]) : value
  }
  if (~value.indexOf("px")) {
    return isNumber(value.split("px")[0]) ? Number(value.split("px")[0]) : value
  }
  return value
}

/**
 * @description: 单位值转RPX单位值
 * @param {string} value 单位值
 * @return {string}
 */
export function unitToRpx(value = 0) {
  if (isEmpty(value)) value = 0
  const next = (v) => +v / (uni.upx2px(100) / 100)
  if (isNumber(value)) return +value
  else if (~value.indexOf("rpx")) {
    return isNumber(value.split("rpx")[0]) ? Number(value.split("rpx")[0]) : 0
  } else if (~value.indexOf("px")) {
    return isNumber(value.split("px")[0]) ? next(value.split("px")[0]) : 0
  }
  return 0
}

/**
 * 根据指定的类型将样式转换为对象或字符串
 * @param {object|string} style - 要转换的样式
 * @param {string} [type='object'] - 转换的类型，可选值为 'object' 或 'string'，默认为 'object'
 * @returns {object|string} - 转换后的样式对象或样式字符串
 */
export function useStyle(style, type = "object") {
  if (isEmpty(style) || (isObject(style) && type === "object") || (isString(style) && type === "string")) {
    if (isObject(style)) {
      for (let key in style) {
        if (isEmpty(style[key]) && style[key] !== 0) delete style[key]
      }
    }
    return style
  }

  if (type === "object") {
    style = style.trim()
    let styleArray = style.split(";")
    let styleObject = {}
    for (let i = 0; i < styleArray.length; i++) {
      if (styleArray[i]) {
        const item = styleArray[i].split(":")
        styleObject[item[0].trim()] = item[1].trim()
      }
    }
    return styleObject
  }

  let string = ""
  for (const key in style) {
    const newKey = key.replace(/([A-Z])/g, "-$1").toLowerCase()
    string += `${newKey}:${style[key]};`
  }
  return string.trim()
}
